OCR 技术详解

光学字符识别(Optical Character Recognition,OCR)是将图片中的文字转换为可编辑、可搜索的计算机文本的技术。本文从系统架构视角,梳理 OCR 技术的行为模型与结构模型,涵盖传统方法和深度学习方法的完整管线。

1. Computer Vision 两条线

Computer Vision(计算机视觉)从图像的数据流向来看,天然分成两条线:

1.1 成像(Image Formation)— 物理世界 → 数字图像

关注"如何从现实世界获取高质量的图像数据",偏电子工程/光学/物理:

环节核心技术代表产品/标准
光学系统镜头设计、光圈、焦距、景深Canon EF、Zeiss、Sony G Master
图像传感器CMOS/CCD、像素尺寸、量子效率、动态范围Sony IMX、Samsung ISOCELL、OmniVision
ISP 流水线Bayer 去马赛克、白平衡、降噪、HDR 合成、色调映射Qualcomm Spectra、Apple ISP、海思麒麟 ISP
计算摄影多帧合成、夜间模式、人像虚化、超分辨率重建Apple Deep Fusion、Google HDR+、华为 XD Fusion
编解码JPEG/HEIF/AVIF/RAW 压缩、色度子采样libjpeg、libheif、x265
3D 成像ToF、结构光、双目立体视觉、LiDARApple LiDAR、Intel RealSense、Microsoft Kinect
核心命题:如何忠实地捕捉和再现物理世界的光信号。评价指标是信噪比、动态范围、色彩准确度。

1.2 解像(Image Understanding)— 数字图像 → 语义信息

关注"从图像像素中提取有意义的结构化信息",偏算法/深度学习/认知:

任务核心方法代表模型/系统
图像分类CNN(ResNet/EfficientNet)、ViTImageNet 预训练模型
目标检测YOLO、Faster R-CNN、DETR、RT-DETRYOLOv8/v11、DINOv2
语义分割FCN、U-Net、DeepLab、SAMSAM 2、Mask2Former
实例分割Mask R-CNN、YOLACT、SAMSAM 2
OCR(文字识别)DB 检测 + CRNN/SVTR 识别;VLM 端到端PaddleOCR、Tesseract、TrOCR
人脸识别FaceNet、ArcFace、InsightFaceArcFace、DeepFace
姿态估计OpenPose、HRNet、ViTPoseMediaPipe Pose
图像生成GAN、VAE、Diffusion Model、DiTStable Diffusion、DALL-E、Flux
多模态理解VLM(CLIP、LLaVA、GPT-4V)GPT-4V、Qwen-VL、PaddleOCR-VL
视频理解3D CNN、Video Transformer、时序动作检测TimeSformer、VideoMAE
核心命题:从像素中提取语义标签、空间位置、逻辑关系。评价指标是精度、召回率、mAP。

1.3 两条线的关系

CV 两条线的关系
图 1.3:成像线与解像线的关系

成像为解像提供输入;解像反过来驱动成像优化(如 ISP 中的 AI 降噪、人脸检测辅助自动对焦)。两者在手机上深度融合——同一块 SoC 上既有 ISP 又有 NPU,成像和解像协同工作。

OCR 属于解像线中的文字识别任务,是图像理解的经典应用。

2. OCR 技术概述

OCR 系统本质上是一个从图像到文本的转换管线。输入是一张包含文字的光栅图像(扫描件、照片、截图),输出是可被计算机处理的文本字符串及文字位置信息。

核心挑战:不同字体、字号、语言(含非拉丁字符如中文/阿拉伯文)、文字方向、弯曲/倾斜/遮挡、光照不均、复杂背景(自然场景)、表格/公式等结构化内容的识别。

2.1 传统 OCR vs 深度学习 OCR

维度传统 OCR(Tesseract 3.x)深度学习 OCR(Tesseract 4+/PaddleOCR)
文本检测连通域分析、投影法CNN 目标检测(EAST/DB/CTPN)
文本识别字符切分 + 模板匹配CRNN+CTC / Transformer+Attention
泛化能力弱,需针对字体训练强,端到端学习
多语言每种语言独立训练数据可多语言联合训练
手写体基本不支持有限支持

3. 发展历程

阶段时间代表技术
早期探索1910s–1950s光电扫描设备,可识别简单字符
模板匹配时代1960s–1980s字符规范化 + 模板匹配;邮政编码识别
特征工程时代1990s–2000sTesseract(HP 1985→Google 2006);SVM/ANN 分类器
深度学习时代2015–至今CRNN+CTC(2015);Tesseract 4 LSTM(2018);PaddleOCR/PP-OCR(2020-2026)
VLM 多模态时代2024–至今PaddleOCR-VL、TrOCR、Donut——视觉-语言模型直接端到端解析文档为 Markdown/JSON

4. 行为图(系统做什么)

4.1 用例图 — 系统功能全景

OCR 用例图
图 4.1:OCR 系统用例图

4.2 活动图 — OCR 识别管线(带泳道)

OCR 活动图
图 4.2:OCR 识别管线活动图(泳道:用户 → 应用 → OCR引擎 → 后处理)

4.3 状态机图 — 文档/图片处理状态

OCR 状态机图
图 4.3:OCR 文档处理状态机图

4.4 序列图 — OCR 引擎内部交互

OCR 序列图
图 4.4:OCR 引擎一次识别请求的序列图

5. 结构图(系统由什么组成)

5.1 组件图 — 系统架构

OCR 组件图
图 5.1:OCR 系统组件架构图

5.2 类图 — 核心模块

OCR 类图
图 5.2:OCR 引擎核心类图(抽象建模)

5.3 部署图 — 部署拓扑

OCR 部署图
图 5.3:OCR 系统多场景部署图

6. 主流 OCR 引擎对比

引擎开源语言架构特点
Tesseract Apache 2.0 C++ (libtesseract) 4.x: LSTM 行识别;5.x: 改进 LSTM 100+ 语言,成熟稳定,命令行 + C/C++ API;无 GUI;不支持版面分析
PaddleOCR Apache 2.0 Python PP-OCRv6:DB 文本检测 + SVTR 文本识别;PaddleOCR-VL:VLM 端到端 100+ 语言,SOTA 精度;版面/表格/公式解析;轻量 VLM 支持 Markdown/JSON 输出
EasyOCR Apache 2.0 Python CRAFT 检测 + CRNN 识别 80+ 语言,即装即用,Torch 后端,API 简洁
TrOCR MIT Python Transformer Encoder-Decoder(ViT + RoBERTa) 基于 HuggingFace,纯 Transformer 架构;仅文字识别(需配合检测器)
OCRmyPDF MPL 2.0 Python 基于 Tesseract,叠加 PDF 文本层 对 PDF 友好,生成可搜索 PDF/A;不会丢失原始文件质量

7. 典型识别管线拆解

7.1 图像预处理

7.2 文本检测

算法年份原理适用
CTPN2016VGG16 + 双向 LSTM 检测水平文本行文档扫描件
EAST2017FCN 直接预测文本区域和旋转角度任意方向文本
CRAFT2019逐字符热力图 + 字符间关联弯曲/不规则文本
DB(Differentiable Binarization)2020可微二值化,高效分割PaddleOCR PP-OCRv4/v5/v6 默认

7.3 文本识别

算法年份原理
CRNN+CTC2015CNN 提取特征 → RNN 序列建模 → CTC 解码(无需字符分割)
ASTER2019STN 矫正 + Attention Seq2Seq
SVTR2022单视觉 Transformer,直接图像到字符序列
TrOCR2021ViT 编码器 + 文本 Transformer 解码器
PaddleOCR-VL20250.9B VLM:NaViT 动态分辨率视觉编码器 + ERNIE 语言模型

7.4 后处理

8. 用户使用手册

8.1 Tesseract

安装

# macOS
brew install tesseract
# Ubuntu/Debian
sudo apt install tesseract-ocr tesseract-ocr-eng tesseract-ocr-chi-sim
# 下载语言包到 tessdata 目录

命令行使用

# 基础识别(英语)
tesseract image.png output -l eng

# 中文识别
tesseract image.png output -l chi_sim

# 指定 OCR 引擎模式 (LSTM) 和页面分割模式
tesseract image.png output -l eng --oem 1 --psm 3

# 输出为可搜索 PDF
tesseract image.png output pdf

# 常用参数
# --oem: 0=旧引擎, 1=LSTM, 2=旧+LSTM, 3=默认
# --psm: 0-13 页面分割模式(3=自动, 6=单文本块, 7=单行, 8=单词)

Python API

import pytesseract
from PIL import Image

text = pytesseract.image_to_string(Image.open('image.png'), lang='eng')
# 获取文字位置
data = pytesseract.image_to_data(Image.open('image.png'), lang='eng',
                                  output_type=pytesseract.Output.DICT)

8.2 PaddleOCR

安装

pip install paddlepaddle  # CPU 版
pip install paddlepaddle-gpu  # GPU 版
pip install paddleocr

场景文字识别(PP-OCRv6)

from paddleocr import PaddleOCR

ocr = PaddleOCR(lang='ch')  # 中文(含英文)
result = ocr.ocr('image.png')
for line in result[0]:
    box = line[0]     # [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]
    text = line[1][0] # 识别文字
    score = line[1][1] # 置信度

文档结构解析(PP-StructureV3)

from paddleocr import PPStructure

engine = PPStructure(lang='ch', use_gpu=True)
result = engine('document.pdf', return_ocr_result_in_table=True)
# 输出包含 Markdown 格式的版面、表格(含 HTML)、公式等

VLM 文档解析(PaddleOCR-VL)

from paddleocr import PaddleOCRVL

engine = PaddleOCRVL(use_gpu=True)
result = engine('document.pdf')
# 输出 Markdown/JSON 格式的结构化文档

8.3 OCRmyPDF

安装与使用

# 安装
pip install ocrmypdf

# 给 PDF 添加 OCR 文本层
ocrmypdf input.pdf output.pdf

# 指定语言、优化压缩
ocrmypdf -l chi_sim+eng --optimize 1 input.pdf output.pdf

# 去斜、清洁扫描件
ocrmypdf --deskew --clean input.pdf output.pdf

8.4 EasyOCR

import easyocr

reader = easyocr.Reader(['ch_sim', 'en'])
result = reader.readtext('image.png')
# 返回 [(bbox, text, confidence), ...]